Amazon Inspector のLambdaのスキャン除外タグ付けをAWS Organizationsのサービスコントロールポリシー (SCP)で防止する
AWS事業本部の梶原@福岡オフィスです。
Amazon Inspector はソフトウェアの脆弱性やネットワークへの意図しない公開がないかなどを継続的にスキャンする脆弱性管理サービスになります。
こちらのAmazon Inspector のスキャンですがコスト要因や他のセキュリティサービスとの競合などの理由でスキャンするリソースの除外設定を行うことができます。
よくある質問 - Amazon Inspector | AWS
Q: リソースをスキャンから除外できますか?
Lambda 関数の場合:はい、リソースタグを追加することで Lambda 関数をスキャンから除外できます。 標準スキャンの場合は、「InspectorExclusion」キーと値「LambdaStandardScanning」を使用してください。 コードをスキャンするには、「InspectorCodeExclusion」キーと値「LambdaCodeScanning」を使用してください。
こちらのタグキーまた値を設定することにより、Lambda関数のInspectorのスキャン対象を管理できるのですが、タグを削除することを忘れたり、また悪意を持って、除外タグをつけてスキャンを回避しようとすることも可能ではあります。
そこで、AWS Organizations のサービスコントロールポリシー (SCP)機能を利用して、Lambda 関数に対して、スキャン除外タグをつけることを防いでみたいと思います。
なお、Amazon ECR のスキャン除外については、タグ付けではなく別の方法になりますので、今回の対象からははずさせていただきます。
Amazon ECR にあるコンテナイメージの場合: はい。スキャン用に設定する Amazon ECR リポジトリを選択できますが、リポジトリ内のすべてのイメージがスキャンされます。包含ルールを作成して、スキャンするリポジトリを選択できます。
EC2のスキャン除外タグ付けの防止については、先行して以下のエントリーでご案内させていただいてますので、ご参考ください
Amazon Inspector のEC2のスキャン除外タグ付けをAWS Organizationsのサービスコントロールポリシー (SCP)で防止する | DevelopersIO
結論
Oraganizations のサービスコントロールポリシー (SCP)を有効にして、以下のポリシーを有効にしたい組織に対してアタッチしてください。
なお、SCPのアタッチ数には上限がありStatementは複数記載することが可能ですので、対象のStatementの部分を現在有効なSCPに追加して有効化することをお勧めします
Lambda関数を標準スキャンから除外するタグ付けを防止したい場合
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyLambdaWithInspectorExclusionTag", "Effect": "Deny", "Action": [ "lambda:*" ], "Resource": [ "arn:aws:lambda:*:*:function:*" ], "Condition": { "StringEquals": { "aws:RequestTag/InspectorExclusion": "LambdaStandardScanning" } } } ] }
Lambda関数をコードスキャンから除外するタグ付けを防止したい場合
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyLambdaWithInspectorCodeExclusionTag", "Effect": "Deny", "Action": [ "lambda:*" ], "Resource": [ "arn:aws:lambda:*:*:function:*" ], "Condition": { "StringEquals": { "aws:RequestTag/InspectorCodeExclusion": "LambdaCodeScanning" } } } ] }
やってみる
AWS Organizations でのサービスコントロールポリシー (SCP)の有効化
AWS Organizationsでサービスコントロールポリシーを有効化します。
サービスコントロールポリシー (SCP)を作成、編集する
- コンソールより新しいサービスコントロールポリシーを作成します
- ポリシーを作成します。
- Lambdaのスキャン除外タグを防止するポリシーを作成します
- 標準スキャン、コードスキャンのどちらも拒否する設定となります
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyLambdaWithInspectorExclusionTag", "Effect": "Deny", "Action": [ "lambda:*" ], "Resource": [ "arn:aws:lambda:*:*:function:*" ], "Condition": { "StringEquals": { "aws:RequestTag/InspectorExclusion": "LambdaStandardScanning" } } }, { "Sid": "DenyLambdaWithInspectorCodeExclusionTag", "Effect": "Deny", "Action": [ "lambda:*" ], "Resource": [ "arn:aws:lambda:*:*:function:*" ], "Condition": { "StringEquals": { "aws:RequestTag/InspectorCodeExclusion": "LambdaCodeScanning" } } } ] }
- 統制対象にしたい組織(OU)に対して、SCPをアタッチします。
- ターゲットタブを選択して、[アタッチ]を選択します
- 統制対象にしたい組織(OU)を選択して、[ポリシーのアタッチ」を実施します
SCPの内容以外は特にEC2のスキャン除外タグの防止の方法と変わりはありませんので、詳細などは、以下エントリーをご参考下さい。
https://dev.classmethod.jp/articles/amazon-scp-inspector-deny-ec2-exclusiontag/#toc-4
正常にアタッチが実施できたら、以降その組織配下ではLambdaのスキャン除外タグを設定することはできなくなります。
設定の検証 Lamba関数へInspector除外タグを設定してみる
Lambda関数を作成してみる
標準スキャンを除外する InspectorExclusion タグキーにタグ値:LambdaStandardScanning を設定した状態でLambda関数を作成してみます。
起動してみると、SCPで制限されている旨のメッセージが表示され作成できませんでした。
「… with an explicit deny in a service control policy」
なお、コードスキャンの除外のための InspectorCodeExclusionタグキーにタグ値:LambdaCodeScanning を設定しても同様です
既存のLambda関数に対して、Inspector除外タグを設定してみる
今度は コードスキャンの除外の為のInspectorCodeExclusionタグキーにタグ値:LambdaCodeScanningを設定してみます。
保存を実施すると、作成と同様にSCPで制限されている旨のメッセージが表示されました。
なお、InspectorCodeExclusion タグを設定しない場合は通常通りLambdaの作成や他のタグ値などの更新は問題なく行えることを確認しておりますが
実際にご自分の環境で行う場合は、検証用のOUなどにアタッチを行い、動作確認など、問題がないかご確認することを推奨いたします。
まとめ
Lambdaの除外タグは タグキー、InspectorExclusion、InspectorCodeExclusion, ともに除外するためには指定した値を設定する必要があります。 なお、値で除外するためには完全一致が必要(後ろに空白などがある場合は対象外)となりますのでご注意ください
EC2のスキャン除外と違い、Lambdaのスキャン除外に関してはタグ値を指定する形のため、タグポリシーでも実施することが可能ですので追ってご案内しようと思います。